package com.zts.modules.sys.service;

import com.zts.base.data.CrudService;
import com.zts.base.page.PageBound;
import com.zts.modules.sys.entity.Resource;
import com.zts.modules.sys.entity.Role;
import com.zts.modules.sys.entity.User;

import java.util.List;
import java.util.Map;

/**
 * Created by lily on 2017/6/13.
 */
public interface RoleService extends CrudService<Role> {
    @Override
    Role get(Long id);

    @Override
    List<Role> getByEntity(Role entity);

    @Override
    List<Role> getByCondition(Map<String, Object> conditions);

    @Override
    List<Role> getList(Role entity, PageBound pageBound);

    @Override
    Role insert(Role entity);

    @Override
    int update(Role entity);

    @Override
    int delete(Role entity);

    @Override
    Role save(Role entity);

    /**
     * 当前角色是否被使用
     *
     * @param id
     * @return
     */
    boolean isUsed(Long id);

    /**
     * 查询拥有当前角色的直接用户，包括两部分：
     * 1：直接给user授权方式时的用户；
     * 2：给group授权方式时该group下的直接用户，且单独撤销授权的用户除外
     *
     * @param id 角色id
     * @return
     */
    List<User> getUsers(Long id);

    /**
     * 查询拥有当前角色的所有用户，包括两部分：
     * 1：直接给user授权方式时的用户；
     * 2：给group授权方式时该group下的所有用户，包括该group的下级组，且单独撤销授权的用户除外
     *
     * @param id 角色id
     * @return
     */
    List<User> getAllUsers(Long id);

    /**
     * 状态是否有效
     *
     * @param id
     * @return
     */
    boolean checkStatus(Long id);

    /**
     * 删除用户的grant_type=撤销权限  的记录
     *
     * @param userId
     * @param groupId
     * @return
     */
    int deleteRoleByUserAndGroup(Long userId, Long groupId);

    /**
     * 批量删除多个用户的grant_type=撤销权限  的记录
     *
     * @param userIds
     * @param groupId
     * @return
     */
    int deleteRoleByUsersAndGroup(List<Long> userIds, Long groupId);

    /**
     * 用户或组单一授权
     *
     * @param objectId
     * @param objectType
     * @param roleId
     * @param grantType
     * @return
     */
    int singleGrant(Long objectId, String objectType, Long roleId, String grantType);


    /**
     * 用户或组批量授权
     *
     * @param objectId
     * @param objectType
     * @param roleIds
     * @param grantType
     * @return
     */
    int batchGrant(Long objectId, String objectType, List<Long> roleIds, String grantType);

    /**
     * 用户或组删除单一角色
     *
     * @param objectId
     * @param objectType
     * @param roleId
     * @param grantType
     * @return
     */
    int singleGrantDelete(Long objectId, String objectType, Long roleId, String grantType);


    /**
     * 用户或组批量删除多个角色
     *
     * @param objectId
     * @param objectType
     * @param roleIds
     * @param grantType
     * @return
     */
    int batchGrantDelete(Long objectId, String objectType, List<Long> roleIds, String grantType);

    /**
     * 给组授权，组下某些用户除外
     *
     * @param objectId
     * @param roleId
     * @param userIds
     * @return
     */
    int groupGrantExcludeUsers(Long objectId, Long roleId, List<Long> userIds);

    /**
     * 给多个用户或组单个授权
     *
     * @param objectIds
     * @param objectType
     * @param roleId
     * @param grantType
     * @return
     */
    int batchGrantForObjs(List<Long> objectIds, String objectType, Long roleId, String grantType);

    /**
     * 校验授权是否存在
     *
     * @param objectId
     * @param objectType
     * @param roleId
     * @param grant_type
     * @return
     */
    boolean checkGrantExist(Long objectId, String objectType, Long roleId, String grant_type);

    /**
     * 查看用户直接拥有的角色
     *
     * @param userId
     * @return
     */
    List<Role> getRolesByUserId(Long userId);

    /**
     * 查看用户拥有的所有角色，包括所在组（group)以及递归上级组拥有的角色
     *
     * @param userId
     * @return
     */
    List<Role> getAllRolesByUserId(Long userId);

    /**
     * 查看组直接拥有的角色
     *
     * @param groupId
     * @return
     */
    List<Role> getRolesByGroupId(Long groupId);

    /**
     * 查看组拥有的所有角色，包括组（group)的递归上级组拥有的角色
     *
     * @param groupId
     * @return
     */
    List<Role> getAllRolesByGroupId(Long groupId);

    /**
     * 查看角色拥有的资源
     *
     * @param roleId
     * @return
     */
    List<Resource> getResources(Long roleId);
}
